package bancosys.tec.persist.hibernate.page;

import java.io.Serializable;

/**
 * @created Oct 16, 2006
 * @author Gustavo Almeida
 */
public class PagingData implements Serializable {
    private int itensPerPage = 0;

    private int currentPage = 0;

    private long totalItens = -1;

    private String orderBy = null;

    private boolean orderAscending = true;

    private boolean incomplete = false;
    
    /**
     * Devolve a página atual.
     * 
     * @return a página atual.
     */
    public int getCurrentPage() {
        return this.currentPage;
    }

    /**
     * Define a página atual.
     * 
     * @param currentPage a página atual.
     */
    public void setCurrentPage(int currentPage) {
        this.currentPage = currentPage;
    }

    /**
     * Devolve o número de itens em cada página.
     * 
     * @return o número de itens por página.
     */
    public int getItensPerPage() {
        return this.itensPerPage;
    }

    /**
     * Define o número de itens em cada página.
     * 
     * @param itensPerPage o número de itens por página.
     */
    public void setItensPerPage(int itensPerPage) {
        this.itensPerPage = itensPerPage;
    }

    /**
     * Devolve o atributo em que deverá ocorrer a ordenação.
     * 
     * @return o atributo em que deverá ocorrer a ordenação.
     */
    public String getOrderBy() {
        return this.orderBy;
    }

    /**
     * Define em qual atributo deverá ocorrer a ordenação.
     * 
     * @param orderBy o atributo em que deverá ocorrer a ordenação.
     */
    public void setOrderBy(String orderBy) {
        this.orderBy = orderBy;
    }

    /**
     * Devolve o número total de itens a recuperar.
     * 
     * @return o número total de itens a recuperar.
     */
    public long getTotalItens() {
        return this.totalItens;
    }

    /**
     * Define o número total de itens a recuperar.
     * 
     * @param totalItens o número total de itens a recuperar.
     */
    public void setTotalItens(long totalItens) {
        this.totalItens = totalItens;
    }

    /**
     * Marca esse PagingData como não inicializado
     */
    public void clearData() {
        this.totalItens = -1;
        this.currentPage = 0;
    }

    /**
     * Retorna <code>true</code> se esse pagingData ja foi inicializado, <code>false</code> caso contrário.
     * 
     * @return <code>true</code> se esse pagingData ja foi inicializado, <code>false</code> caso contrário
     */
    public boolean isDataInitialized() {
        return this.totalItens != -1;
    }

    /**
     * A orderm a ascendente?
     * 
     * @return <code>true</code> caso a ordem seja ascendente, <code>false</code> caso contrário.
     */
    public boolean isOrderAscending() {
        return this.orderAscending;
    }

    /**
     * Define se a ordem deve ou não ser ascendente.
     * 
     * @param orderAscending <code>true</code> caso a ordem seja ascendente, <code>false</code> caso contrário.
     */
    public void setOrderAscending(boolean orderAscending) {
        this.orderAscending = orderAscending;
    }

    /**
     * Devolve o número de páginas.
     * 
     * @return o número de páginas.
     */
    public int getNumberOfPages() {
        return (int) Math.ceil((double) this.totalItens / (double) this.itensPerPage);
    }

    /**
     * Move para a próxima página, caso exista.
     */
    public void nextPage() {
        if (this.currentPage + 1 < this.getNumberOfPages()) {
            this.currentPage++;
        }
    }

    /**
     * Move para a página anteriror, caso exista.
     */
    public void previewsPage() {
        if (this.currentPage > 0) {
            this.currentPage--;
        }
    }

    /**
     * @return the incomplete
     */
    public boolean isIncomplete() {
        return incomplete;
    }

    /**
     * @param incomplete the incomplete to set
     */
    public void setIncomplete(boolean incomplete) {
        this.incomplete = incomplete;
    }
}
